package py.com.alfa.escriba.web.services.impl;

import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;

import py.com.alfa.escriba.exception.ErrorCode;
import py.com.alfa.escriba.exception.ServiceException;
import py.com.alfa.escriba.persistence.dao.FuncionalidadDAO;
import py.com.alfa.escriba.persistence.dto.admin.FuncionalidadDTO;
import py.com.alfa.escriba.util.Utils;
import py.com.alfa.escriba.web.interceptor.InvocationContext;
import py.com.alfa.escriba.web.services.FuncionalidadService;

public class FuncionalidadServiceImpl implements FuncionalidadService{

  private FuncionalidadDAO funcionalidadDAO;

  public void setFuncionalidadDAO(FuncionalidadDAO funcionalidadDAO) {
    this.funcionalidadDAO = funcionalidadDAO;
  }

  @Override
  public List<FuncionalidadDTO> listFuncionalidad(InvocationContext ic) throws ServiceException {
    List<FuncionalidadDTO> funcionalidads =  funcionalidadDAO.listFuncionalidad();

    return funcionalidads;
  }
  
  @Override
  public List<FuncionalidadDTO> listFuncNoAsignadas(InvocationContext ic, Long idPerfil) throws ServiceException {
    List<FuncionalidadDTO> funcionalidads =  funcionalidadDAO.listFuncNoAsignadas(idPerfil);

    return funcionalidads;
  }

  @Override
  public FuncionalidadDTO getFuncionalidad(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    FuncionalidadDTO funcionalidad =  funcionalidadDAO.getFuncionalidadById(id);

    if (funcionalidad == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"funcionalidad.notfound", id);

    return funcionalidad;
  }

  @Override
  public void deleteFuncionalidad(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    FuncionalidadDTO funcionalidad =  funcionalidadDAO.getFuncionalidadById(id);

    if(funcionalidad == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"funcionalidad.notfound", id);

    try {
      funcionalidadDAO.deleteFuncionalidad(funcionalidad);
    }
    catch (DataIntegrityViolationException e){
      throw new ServiceException(ErrorCode.DATA_INTEGRITY_VIOLATION, "funcionalidad.constraint.violation", id);
    }

  }

  @Override
  public FuncionalidadDTO updateFuncionalidad(Long id, FuncionalidadDTO dto, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    if (null == dto)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    FuncionalidadDTO funcionalidad = funcionalidadDAO.getFuncionalidadById(id);

    if (funcionalidad == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"funcionalidad.notfound", id);

    if(dto.getDescripcion() != null)
    	funcionalidad.setDescripcion(dto.getDescripcion());
    
    if(dto.getCodigo() != null)
    	funcionalidad.setCodigo(dto.getCodigo());

    Utils.validarDTO(funcionalidad);
    funcionalidadDAO.updateFuncionalidad(funcionalidad);

    return funcionalidad;
  }
  @Override
  public FuncionalidadDTO createFuncionalidad(FuncionalidadDTO dto, InvocationContext ic) throws ServiceException {
    if (dto == null)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    try {
      funcionalidadDAO.createFuncionalidad(dto);
    }
    catch (DuplicateKeyException e){
      throw new ServiceException(ErrorCode.DUPLICATE_KEY_EXCEPTION, "funcionalidad.duplicate.key");
    }

    return dto;
  }

}